//  Copyright (c) 2025 coze-dev
//  SPDX-License-Identifier: MIT

//  # Copyright (c) 2025 coze-dev
//  # SPDX-License-Identifier: MIT

const fs = require("fs");
const path = require("path");
const ig = require("ignore")();

const ignoreFile = fs.readFileSync(path.join(__dirname, "../../../.gitignore"), {
  encoding: "utf-8",
});
ig.add(ignoreFile);

const src = path.resolve(__dirname, '../../../');

const header = ` Copyright (c) 2025 coze-dev
 SPDX-License-Identifier: MIT`;

const bashHeader = `#!/usr/bin/env bash`;
const nodeHeader = `#!/usr/bin/env node`;
const rushPreHeader = `// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED.`;

/**
 * 给文件夹下所有文件添加 License Header
 * @param {string} targetDir - 目标文件夹路径（绝对路径）
 * @param {string} licenseContent - 要添加的 License 内容（纯文本）
 * @param {object} options - 配置项
 * @param {string[]} [options.includeExts] - 需要处理的文件扩展名（如 ['.js', '.ts']），默认处理所有文本文件
 * @param {string[]} [options.excludeDirs] - 需要排除的目录（如 ['node_modules', 'dist']）
 * @param {string} [options.commentLinePrefix] - 注释前缀（如 '// ' 或 '/* '），默认不添加注释格式
 * @param {boolean} [options.force] - 是否强制覆盖（即使已有 License 也重新添加），默认 false
 */
function addLicenseHeader(targetDir, licenseContent, options = {}) {
  // 默认配置
  const {
    includeExts = [".js", ".ts", ".mjs", ".cjs", ".html", ".css", ".scss"], // 常见文本文件扩展名
    commentLinePrefix = "// ", // 默认使用 JS 风格注释
    commentPrefix,
    commentSuffix,
    force = false,
  } = options;

  // 预处理 License 内容（添加注释格式）
  const licensedText =
    (commentPrefix ? commentPrefix + "\n" : "") +
    licenseContent
      .split("\n")
      .map((line) => commentLinePrefix + line)
      .join("\n") +
    (commentSuffix ? "\n" + commentSuffix : "") +
    "\n\n"; // 末尾加空行分隔正文

  // 递归遍历函数
  function traverseDir(currentDir) {
    // 读取当前目录下的所有文件/目录
    const entries = fs.readdirSync(currentDir, { withFileTypes: true });

    for (const entry of entries) {
      const fullPath = path.join(currentDir, entry.name);

      // 排除指定目录
      if (
        entry.isDirectory() &&
        ig.ignores(path.relative(targetDir, fullPath))
      ) {
        continue;
      }

      if (entry.isDirectory()) {
        // 递归处理子目录
        traverseDir(fullPath);
      } else {
        // 处理文件
        processFile(fullPath);
      }
    }
  }

  // 文件处理函数
  function processFile(filePath) {
    // 检查文件扩展名是否在允许列表
    const ext = path.extname(filePath).toLowerCase();
    if (includeExts.length > 0 && !includeExts.includes(ext)) {
      return;
    }

    try {
      // 读取文件内容
      const originalContent = fs.readFileSync(filePath, "utf8");

      // 检查是否已存在 License（简单匹配开头部分）
      if (!force && (originalContent.startsWith(licensedText.trim()) || originalContent.startsWith(bashHeader.trim())  || originalContent.startsWith(nodeHeader.trim())  || originalContent.startsWith(rushPreHeader.trim()))) {
        console.log(`[跳过] 已存在 License: ${filePath}`);
        return;
      }

      // 添加 License Header（保留原有 BOM 和 shebang）
      let newContent = originalContent;

      // 处理可能的 shebang（如 #!/usr/bin/env node）
      const shebangMatch = originalContent.match(/^#!.*\n/);
      if (shebangMatch) {
        // 将 License 放在 shebang 之后
        newContent =
          shebangMatch[0] +
          licensedText +
          originalContent.replace(shebangMatch[0], "");
      } else {
        newContent = licensedText + originalContent;
      }

      // 写入文件
      fs.writeFileSync(filePath, newContent, "utf8");
      console.log(`[成功] 已添加 License: ${filePath}`);
    } catch (err) {
      console.error(`[错误] 处理文件失败 ${filePath}:`, err.message);
    }
  }

  // 启动遍历
  if (fs.existsSync(targetDir) && fs.statSync(targetDir).isDirectory()) {
    traverseDir(targetDir);
    console.log("License Header 添加完成");
  } else {
    console.error("错误：目标路径不是有效文件夹");
  }
}

// 调用函数（请替换为你的项目路径）
addLicenseHeader(
    src, // 目标文件夹（当前目录下的 your-project 文件夹）
    header,
    {
        includeExts: ['.js', '.ts', '.tsx', '.jsx', '.mjs', '.cjs', '.scss', '.less', '.prisma', '.styl'], // 只处理这些扩展名的文件
        commentLinePrefix: '// ', // JS/TS 使用双斜杠注释
        force: false // 不强制覆盖已有 License
    }
);

// 调用函数（请替换为你的项目路径）
addLicenseHeader(
    src, // 目标文件夹（当前目录下的 your-project 文件夹）
    header,
    {
        includeExts: ['.sh'],
        commentLinePrefix: '# ',
        force: false
    }
);

// 调用函数（请替换为你的项目路径）
addLicenseHeader(
  src, // 目标文件夹（当前目录下的 your-project 文件夹）
  header,
  {
    includeExts: [".css"],
    commentLinePrefix: " * ",
    commentPrefix: "/**",
    commentSuffix: " **/",
    force: false,
  }
);


// 调用函数（请替换为你的项目路径）
addLicenseHeader(
    src, // 目标文件夹（当前目录下的 your-project 文件夹）
    header,
    {
      includeExts: [".sql"],
      commentLinePrefix: "-- ",
      force: false,
    }
  );


// 调用函数（请替换为你的项目路径）
addLicenseHeader(
    src, // 目标文件夹（当前目录下的 your-project 文件夹）
    header,
    {
      includeExts: [".pug"],
      commentLinePrefix: "//- ",
      force: false,
    }
  );

addLicenseHeader(
  src, // 目标文件夹（当前目录下的 your-project 文件夹）
  header,
  {
    includeExts: [".vue", '.svelte'],
    commentLinePrefix: "",
    commentPrefix: "<!-- ",
    commentSuffix: " -->",
    force: false,
  }
);
